﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "CollaborationCacheInterface.h"
#include "IObject.h"

namespace gcmp
{
    /// \brief 构件级协同，Element版本号管理
    class COLLABORATION_CACHE_INTERFACE_EXPORT IElementEditPrivilegeManager : public IObject
    {
        DEFINE_CAST_DERIVED(IElementEditPrivilegeManager, IObject)
    public:
        /// \brief 设置Element编辑权限
        ///
        /// 不存在添加，存在用新值覆盖
        ///
        /// \param elementId 需要设置编辑权限的ElementId
        /// \param canEdit Element编辑权限
        /// \return void
        virtual void Set(const ElementId& elementId, bool canEdit) = 0;

        /// \brief 批量设置Element的编辑权限
        ///
        /// 不存在添加，存在用新值覆盖
        ///
        /// \param elementsVersion 需要设置版本的ElementIds及对应版本号
        /// \return void
        virtual void Set(const std::unordered_map<ElementId, bool, ElementIdHash>& elementsEditPrivilege) = 0;

        /// \brief 根据ElementId删除编辑权限
        ///
        /// \param elementId 需要删除的编辑权限的ElementId
        /// \return void
        virtual void Delete(const ElementId& elementId) = 0;

        /// \brief 根据ElementIds批量删除Element的编辑权限
        ///
        /// \param elementIds 需要删除的编辑权限的批量ElementId
        /// \return void
        virtual void Delete(const std::vector<ElementId>& elementIds) = 0;

        /// \brief 根据ElementId获取的编辑权限
        ///
        ///不在缓存中的构件，编辑权限为false
        ///
        /// \param elementId 需要获取的编辑权限的ElementId
        /// \return Int32 获取的编辑权限,true;有编辑权限；false:没有编辑权限
        virtual bool Get(const ElementId& elementId) const = 0;

        /// \brief 根据ElementId批量获取编辑权限
        ///
        /// \param elementIds[int] 需要获取的编辑权限的批量ElementId
        /// \param std::unordered_map<ElementId, bool, ElementIdHash>[out] 批量获取的ElementId及对应的编辑权限
        /// \return bool 输入为空，或者全部获取成功为true；有任意的Element获取失败，返回false
        virtual bool Get(const std::vector<ElementId>& elementIds, std::unordered_map<ElementId, bool, ElementIdHash>& elementsEditPrivilege) const = 0;

        /// \brief 获取缓存中所有Element的编辑权限
        ///
        /// \return std::unordered_map<ElementId, bool, ElementIdHash> 缓存中所有Elementid及对应的编辑权限
        virtual std::unordered_map<ElementId, bool, ElementIdHash>& GetAll() = 0;

        /// \brief 获取缓存中所有Element的编辑权限
        ///
        /// \return std::unordered_map<ElementId, bool, ElementIdHash> 缓存中所有Elementid及对应的编辑权限
        virtual const std::unordered_map<ElementId, bool, ElementIdHash>& GetAll() const = 0;

        /// \brief 清理所有Element的编辑权限
        ///
        /// \return void
        virtual void Clear() = 0;

        /// \brief 将构件锁id及同批加锁的构件ids设置到缓存中
        ///
        /// 没有则添加，有则覆盖
        ///
        /// \param elementsLockId 锁id
        /// \param elementIds 同批加锁的构件ids
        /// \return void
        virtual void SetElementsLock(const std::wstring& elementsLockId, const std::vector<ElementId>& elementIds) = 0;

        /// \brief 根据锁id拿到同批加锁的构件ids
        ///
        /// \param elementsLockId[int] 锁id
        /// \param elementIds[out] 同批加锁的构件ids
        /// \return void
        virtual void GetElementIdsByLockId(const std::wstring& elementsLockId, std::vector<ElementId>& elementIds) const = 0;

        /// \brief 拿到所有的锁id及对应的同批加锁的构件ids
        ///
        /// \return std::unordered_map<std::wstring, std::vector<ElementId>> 所有的锁id及对应的同批加锁的构件ids
        virtual const std::unordered_map<std::wstring, std::vector<ElementId>>& GetAllElementsLock() const = 0 ;
        
        /// \brief 根据锁id删除同批加锁的构件ids
        ///
        /// \param elementsLockId 锁id
        /// \return void
        virtual void DeleteElementsLock(const std::wstring& elementsLockId) = 0;

        /// \brief 删除所有的锁id及对应的同批加锁的构件ids
        ///
        /// \return void
        virtual void DeleteAllElementsLock() = 0;
    };
}